package com.icoolkj.ms.upload.service;

import com.icoolkj.ms.upload.dto.FileUploadDTO;
import com.icoolkj.ms.upload.model.FileInfo;
import com.icoolkj.ms.upload.vo.FileInfoVO;
import org.springframework.web.multipart.MultipartFile;

import java.util.List;

/**
 * 文件服务接口
 * 
 * @author icoolkj
 */
public interface FileService {

    /**
     * 上传文件
     *
     * @param file         文件
     * @param businessType 业务类型
     * @param businessId   业务ID
     * @return 文件信息
     */
    FileInfoVO upload(MultipartFile file, String businessType, String businessId);

    /**
     * 上传文件并设置状态
     *
     * @param file         文件
     * @param businessType 业务类型
     * @param businessId   业务ID
     * @param isPermanent  是否为永久文件
     * @return 文件信息
     */
    FileInfoVO uploadWithStatus(MultipartFile file, String businessType, String businessId, boolean isPermanent);

    /**
     * 批量上传文件
     *
     * @param files        文件列表
     * @param businessType 业务类型
     * @param businessId   业务ID
     * @return 文件信息列表
     */
    List<FileInfoVO> batchUpload(List<MultipartFile> files, String businessType, String businessId);

    /**
     * 批量上传文件并设置状态
     *
     * @param files        文件列表
     * @param businessType 业务类型
     * @param businessId   业务ID
     * @param isPermanent  是否为永久文件
     * @return 文件信息列表
     */
    List<FileInfoVO> batchUploadWithStatus(List<MultipartFile> files, String businessType, String businessId, boolean isPermanent);

    /**
     * 逻辑删除文件
     *
     * @param fileId 文件ID
     * @return 是否成功
     */
    boolean delete(Long fileId);

    /**
     * 批量逻辑删除文件
     *
     * @param fileIds 文件ID数组
     * @return 是否成功
     */
    boolean batchDelete(Long[] fileIds);
    
    /**
     * 物理删除文件（管理员操作）
     *
     * @param fileId 文件ID
     * @return 是否成功
     */
    boolean deletePhysical(Long fileId);

    /**
     * 批量物理删除文件（管理员操作）
     *
     * @param fileIds 文件ID数组
     * @return 是否成功
     */
    boolean batchDeletePhysical(Long[] fileIds);

    /**
     * 根据ID获取文件信息
     *
     * @param fileId 文件ID
     * @return 文件信息
     */
    FileInfoVO getInfo(Long fileId);

    /**
     * 查询文件列表
     *
     * @param fileInfo 文件信息
     * @return 文件列表
     */
    List<FileInfoVO> getList(FileInfo fileInfo);

    /**
     * 根据业务类型和业务ID查询文件列表
     *
     * @param businessType 业务类型
     * @param businessId   业务ID
     * @return 文件列表
     */
    List<FileInfoVO> getListByBusiness(String businessType, String businessId);

    /**
     * 更新文件状态
     *
     * @param fileId 文件ID
     * @param status 状态（0: 临时文件，1: 正式文件）
     * @return 是否成功
     */
    boolean updateStatus(Long fileId, Integer status);

    /**
     * 批量更新文件状态
     *
     * @param fileIds 文件ID数组
     * @param status  状态（0: 临时文件，1: 正式文件）
     * @return 是否成功
     */
    boolean batchUpdateStatus(Long[] fileIds, Integer status);
    
    /**
     * 根据业务类型和业务ID更新文件状态
     *
     * @param businessType 业务类型
     * @param businessId   业务ID
     * @param status       状态（0: 临时文件，1: 正式文件）
     * @return 是否成功
     */
    boolean updateStatusByBusiness(String businessType, String businessId, Integer status);
} 